package com.virtualperson.util;

import com.virtualperson.exception.ImageValidationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 图像验证工具类
 */
@Slf4j
public class ImageValidationUtil {
    // 支持的图片格式
    private static final Set<String> SUPPORTED_FORMATS = new HashSet<>(Arrays.asList(
        "jpg", "jpeg", "png", "webp"
    ));

    /**
     * 验证图片URL
     * @param imageUrl 图片URL
     * @param paramName 参数名称（用于错误提示）
     * @param isMask 是否是mask图片
     * @param isFaceImage 是否是人脸图片
     * @param isBackgroundImage 是否是背景图片
     * @throws ImageValidationException 如果验证失败
     */
    public static void validateImage(String imageUrl, String paramName, boolean isMask, boolean isFaceImage, boolean isBackgroundImage) {
        if (!StringUtils.hasText(imageUrl)) {
            throw new ImageValidationException(paramName + "不能为空");
        }

        try {
            // 验证URL格式
            URL url = new URL(imageUrl);
            String path = url.getPath().toLowerCase();
            
            // 验证文件格式
            if (path.contains(".")) {
                String format = path.substring(path.lastIndexOf('.') + 1);
                if (!SUPPORTED_FORMATS.contains(format)) {
                    throw new ImageValidationException(
                        String.format("%s必须是以下格式之一：%s", 
                            paramName, 
                            String.join("、", SUPPORTED_FORMATS))
                    );
                }
            }

            // 验证URL协议
            String protocol = url.getProtocol().toLowerCase();
            if (!protocol.equals("http") && !protocol.equals("https")) {
                throw new ImageValidationException(
                    String.format("%s必须是HTTP或HTTPS协议", paramName)
                );
            }

            // 验证URL主机
            String host = url.getHost();
            if (host == null || host.trim().isEmpty()) {
                throw new ImageValidationException(
                    String.format("%s必须包含有效的主机名", paramName)
                );
            }

            log.info("图片URL验证通过: {}", imageUrl);
        } catch (ImageValidationException e) {
            throw e;
        } catch (Exception e) {
            throw new ImageValidationException(
                String.format("%s验证失败：%s", paramName, e.getMessage())
            );
        }
    }
} 